package com.face.entry.controller;

import com.face.base.config.Result;
import com.face.base.controller.BaseFaceController;
import com.face.base.pojo.UserInfo;
import com.face.base.service.UserService;
import com.face.base.utils.BaiduAiUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FaceEntryController {

    /**
     * 基于 百度AI SDK 的人脸识别。
     */
    @Autowired
    private BaiduAiUtil baiduAiUtil;

    /**
     * 用户 service 层。
     */
    @Autowired
    private UserService userService;

    /**
     * 数据资源事务管理。
     */
    @Autowired
    private DataSourceTransactionManager dataSourceTransactionManager;

    /**
     * 人脸录入。【人脸注册】
     *
     * @param userID：编号
     * @param userName：姓名
     * @param userIDCard：身份证号
     * @param imgData：人脸照片
     * @return 录入结果。
     */
    @PostMapping("/face")
    public Result<String> face(
            @RequestParam("userID") String userID
            , @RequestParam("userName") String userName
            , @RequestParam("userIDCard") String userIDCard
            , @RequestParam("userFace") String imgData
    ) {
        System.out.println("userID = " + userID);
        System.out.println("userName = " + userName);
        System.out.println("userIDCard = " + userIDCard);
        System.out.println("userFace = " + imgData.substring(0, 50));

        // 首先查询当前用户是否存在数据库中。
        Boolean user = userService.isUser(userID);
        // 不存在，先进行人脸检测，检测出人脸，再添加数据到数据库中，接着就往人脸库中添加。
        if (!user) {
            return addUser(new UserInfo(userID, userName, userIDCard, "技术部", "广东工程职业技术学院")
                    , imgData);
//            Result<String> stringResult = baseFaceController.faceCheck(imgData);
//            if (stringResult.getCode() == 200 && "true".equalsIgnoreCase(stringResult.getMsg())) {
//                return addUser(new UserInfo(userID, userName, userIDCard, "技术部", "广东工程职业技术学院")
//                        , imgData);
////                    Boolean addUser = userService.addUser(new UserInfo(userID, userName, userIDCard, "技术部", "广东工程职业技术学院"));
////                    // 若用户不存在
////                    if (!baiduAiUtil.faceExist(userID)) {
////                        // 光线太弱，也会添加失败。
////                        if (baiduAiUtil.faceRegister(userID, imgData.substring(22))) {
////                            return new Result<>(200, "录入成功");
////                        }
////                    }
////                    return new Result<>(0,"人脸不完全");
//            }
//            // 不存在，先进行人脸检测，检测不出人脸，就直接回传信息给客户端，说检测不出人脸，或者格式错误。
//            else if (stringResult.getCode() == 200 && "false".equalsIgnoreCase(stringResult.getMsg())) {
//                return new Result<>(0, "未检测到人脸");
//            } else {
//                return new Result<>(0, stringResult.getMsg());
//            }
        } else {

            // 存在，则先去人脸库验证该人脸是否存在，若不存在，则进行人脸注册，并说该用户”人脸追加完毕“。

            // 若用户不存在
            if (!baiduAiUtil.faceExist(userID)) {
                // 光线太弱，也会添加失败。
                if (baiduAiUtil.faceRegister(userID, imgData.substring(22))) {
                    return new Result<>(200, "人脸追加完毕");
                }
//                return new Result<>(0,"人脸追加失败");
                return new Result<>(0, BaiduAiUtil.faceMsg);
            }
            // 存在，则先去人脸库验证该人脸是否存在，若存在，则返回信息给客户端，说该用户“已注册过”。
            else {
                return new Result<>(0, "已注册过");
            }
        }

//        // 若用户不存在
//        if (!baiduAiUtil.faceExist(userID)){
//            Boolean aBoolean = baiduAiUtil.faceRegister(userID, imgData.substring(22));
//            // 光线太弱，也会添加失败。
//            System.out.println("添加是否成功：" + aBoolean);
//            if (aBoolean){
////                this.userID = userID;
//                return new Result<>(200,"录入成功");
//            }
//        }
//        return new Result<>(0,"不支持该格式录入");
    }

    /**
     * 人脸录入。【人脸注册】中的子模块部分。
     *
     * @param userInfo：需要添加的学生信息。
     * @param imgData：人脸照片。
     * @return 录入结果。
     */
    Result<String> addUser(UserInfo userInfo, String imgData) {
        //手动开启事务和回滚
        // 1.获取事务定义
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        // 2.设置事务隔离级别，开启新事务
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
//        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
        // 3.获得事务状态
        TransactionStatus status = dataSourceTransactionManager.getTransaction(def);


        try {
            // 添加用户信息。【自动录入人脸信息】
            Boolean addUser = userService.addUser(userInfo);

            // 若用户不存在
            if (addUser && !baiduAiUtil.faceExist(userInfo.getUserID())) {
                System.out.println("添加的情况：" + addUser);
                // 光线太弱，也会添加失败。
                if (baiduAiUtil.faceRegister(userInfo.getUserID(), imgData.substring(22))) {
                    dataSourceTransactionManager.commit(status);
                    return new Result<>(200, "录入成功");
                }
            }
            throw new Exception();
        } catch (Exception e) {
            //masterTransactionManager 数据源回滚
            dataSourceTransactionManager.rollback(status);
            System.out.println("添加失败");
            return new Result<>(0, "SUCCESS".equalsIgnoreCase(BaiduAiUtil.faceMsg)?"录入失败":BaiduAiUtil.faceMsg);
        }
    }


}
